/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution543 {

    /**
     * 543. 二叉树的直径
     * 题目：
     *      给定一棵二叉树，你需要计算它的直径长度。
     *      一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过根结点。
     * 示例:
     *           1
     *          / \
     *         2   3
     *        / \
     *       4   5
     *
     *  返回3，它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。
     *  注意：两结点之间的路径长度是以它们之间边的数目表示。
     */


    public int diameterOfBinaryTree(MyTreeNode root) {
        if (root == null)
            return 0;

        int selt = longestDistance(root.left) + longestDistance(root.right);
        int leftMax = diameterOfBinaryTree(root.left);
        int rightMax = diameterOfBinaryTree(root.right);


        return Math.max(Math.max(selt, leftMax), rightMax);
    }

    public int longestDistance(MyTreeNode root){
        if (root == null)
            return 0;

        if(root.left == null)
            return longestDistance(root.right) + 1;

        if(root.right == null)
            return longestDistance(root.left) + 1;

        return Math.max(longestDistance(root.left),longestDistance(root.right)) + 1;
    }

}

class MyTreeNode {
    int val;
    MyTreeNode left;
    MyTreeNode right;
    MyTreeNode(int x) { val = x; }
}
